<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<title></title>
</head>
<body>
<script type="text/javascript">
	
	/*
		作用域：代码或变量可以使用的范围
		局部作用域(函数作用域)：函数内部就是局部作用域
		全局作用域：整个script标签或者单独的js文件(在window中)函数外部用var声明的变量
	*/
	var a = 100
	console.log(window)
	function fn(){
		//在函数内部的变量是局部变量只能在函数内部用
		// var a = 10
		console.log(a)
		c = 20
	}
	fn()
	console.log(a) // a is not defined
	console.log(c)

	function f2(){
		var z = b = c = 10
		//相当于 
		// var z = 10
		// b = 10
		// c = 10
	}
	f2()
	// console.log("f20--",z)
	console.log("f20--",b)
	console.log("f20--",c)
	//===========
	function f3(){
		var a = 100000
		function f4() {
			console.log(a)//100000
		}
		f4()
	}
	f3()

	//2.作用域链：如果再局部作用域使用变量的时候，他会从这个函数本身的作用域去找这个变量，如果没有。就往上一层找，直到全局作用域，这个方式就是作用域链

	var e = 2
	function fun(){
		var e = 4
		function fchild(){
			var e = 5
			console.log(e)
		}
		fchild() //5
	}

	fun()
	//=================
	var n1 = 10
	var n2 = 20
	function fn2(n1){
		// 形参n1接受到传进来的值10
		console.log(n1) //10
		n1 += 5       //n1指的是形参n1
		console.log(n1) //15
		var n2 = 200
		console.log(n2) //200
	}
	fn2(10) //传递到函数，优先操作函数里面的
	console.log(n1)//10
	console.log(n2)//20


	//js的预解析---函数的提升  过程：把声明的变量和函数进行提升
	//变量的提升：将变量的声明提升到当前作用域的最上方，但是赋值不提升，留在原地

	console.log(m1) //undefined
	var m1 = 1;

	// ---->
	/*var m1 
	console.log(m1)
	m1 = 1*/
	/*var game = '火影'
	function f(){
		console.log(game)
		var game = '和平精英'
		console.log(game)
	}

	f()

	// 相当于
	var game;
	game = '火影'
	function f(){
		var game
		console.log(game)
		game = '和平精英'
		console.log(game)
	}*/

	//=============================
	var name = '火影'
	function f2(){
	
		console.log(name) //huo
		var name = '柯南'
		console.log(name) //ke
	}
	f2(name)
// 相当于
	/*var name;
	name = '火影'
	function f(){
		//在函数内部，参数name已存在 var name就会被忽略掉
		var name
		console.log(name)
		name = '和平精英'
		console.log(name)
	}
	f2(name)*/
</script>
</body>
</html>